from typing import Dict, Optional
from fastapi import FastAPI
import uvicorn
from pydantic import BaseModel

'''
    Request body + path + query parameters 综合栗子
    可以同时声明请求体、路径参数、查询参数
    FastAPI 可以识别出它们中的每一个，并从正确的位置获取到数据
'''


class Item(BaseModel):
    name: str
    desc: Optional[str] = None
    price: float
    tax: Optional[float] = None


app = FastAPI()


@app.post('/items/{item_id}')
async def create_item(item_id: int, item: Item, name: Optional[str] = None):
    result = {"item_id": item_id, **item.dict()}
    print(result)
    if name:
        result.update({'name': name})
    return result

'''
    FastAPI 识别参数的逻辑:
    如果参数也在路径中声明，它将解释为路径参数【item_id】
    如果参数是单数类型（如int、float、str、boo l等），它将被解释为查询参数【name】
    如果参数被声明为 Pydantic 模型的类型，它将被解析为请求体【item】
'''

if __name__ == '__main__':
    uvicorn.run(app='main3:app', host='127.0.0.1', port=8000, reload=True, debug=True)
